import ast
import argparse

import astpretty

from .lex import get_lexer, tokens
from .yacc import get_parser

argparser = argparse.ArgumentParser()
argparser.add_argument('文件名', action='store')
argparser.add_argument('-执行', help='执行一个.白话文件', action='store_true')
argparser.add_argument('-编译', help='编译一个.白话文件', action='store_true')
argparser.add_argument('-目标', help='指定输出文件的位置', action='store')
argparser.add_argument('-语法树', help='输出一个.白话的语法树', action='store_true')

def bpm(args):
    parser = get_parser(get_lexer(), tokens)
    def parse_tree(filename):
        with open(filename, encoding='utf-8') as f:
            return parser.parse(f.read())
    def parse_py(filename):
        return ast.unparse(parse_tree(filename))
    def output(input, target):
        with open(target, 'w', encoding='utf-8') as f:
            f.write(input)
    def getfilename(ext):
        if args.目标:
            return args.目标
        elif args.文件名.endswith('.白话'):
            return args.文件名[:-3] + ext
        else:
            return args.文件名 + ext
    if args.执行:
        with open(args.文件名, encoding='utf-8') as f:
            exec(parse_py(args.文件名))
    elif args.编译:
        output(parse_py(args.文件名), getfilename('.py'))
    elif args.语法树:
        output(astpretty.pformat(parse_tree(args.文件名), show_offsets=False), getfilename('.t'))

def main():
    args = argparser.parse_args()
    bpm(args)